﻿/*
 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */

(function () {
    CKEDITOR.plugins.add('enterkey', {requires:['keystrokes', 'indent'], init:function (h) {
        var i = h.specialKeys;
        i[13] = d;
        i[CKEDITOR.SHIFT + 13] = c;
    }});
    var a, b = /^h[1-6]$/;

    function c(h) {
        a = 1;
        return d(h, h.config.shiftEnterMode);
    }

    ;
    function d(h, i) {
        if (h.mode != 'wysiwyg')return false;
        if (!i)i = h.config.enterMode;
        setTimeout(function () {
            h.fire('saveSnapshot');
            if (i == CKEDITOR.ENTER_BR || h.getSelection().getStartElement().hasAscendant('pre', true))f(h, i); else e(h, i);
            a = 0;
        }, 0);
        return true;
    }

    ;
    function e(h, i, j) {
        j = j || g(h);
        var k = j.document, l = i == CKEDITOR.ENTER_DIV ? 'div' : 'p', m = j.splitBlock(l);
        if (!m)return;
        var n = m.previousBlock, o = m.nextBlock, p = m.wasStartOfBlock, q = m.wasEndOfBlock, r;
        if (o) {
            r = o.getParent();
            if (r.is('li')) {
                o.breakParent(r);
                o.move(o.getNext(), true);
            }
        } else if (n && (r = n.getParent()) && (r.is('li'))) {
            n.breakParent(r);
            j.moveToElementEditStart(n.getNext());
            n.move(n.getPrevious());
        }
        if (!p && !q) {
            if (o.is('li') && (r = o.getFirst()) && (r.is && r.is('ul', 'ol')))o.insertBefore(k.createText('\xa0'), r);
            if (o)j.moveToElementEditStart(o);
        } else {
            if (p && q && n.is('li')) {
                h.execCommand('outdent');
                return;
            }
            var s;
            if (n) {
                if (!a && !b.test(n.getName()))s = n.clone();
            } else if (o)s = o.clone();
            if (!s)s = k.createElement(l);
            var t = m.elementPath;
            if (t)for (var u = 0, v = t.elements.length; u < v; u++) {
                var w = t.elements[u];
                if (w.equals(t.block) || w.equals(t.blockLimit))break;
                if (CKEDITOR.dtd.$removeEmpty[w.getName()]) {
                    w = w.clone();
                    s.moveChildren(w);
                    s.append(w);
                }
            }
            if (!CKEDITOR.env.ie)s.appendBogus();
            j.insertNode(s);
            if (CKEDITOR.env.ie && p && (!q || !n.getChildCount())) {
                j.moveToElementEditStart(q ? n : s);
                j.select();
            }
            j.moveToElementEditStart(p && !q ? o : s);
        }
        if (!CKEDITOR.env.ie)if (o) {
            var x = k.createElement('span');
            x.setHtml('&nbsp;');
            j.insertNode(x);
            x.scrollIntoView();
            j.deleteContents();
        } else s.scrollIntoView();
        j.select();
    }

    ;
    function f(h, i) {
        var j = g(h), k = j.document, l = i == CKEDITOR.ENTER_DIV ? 'div' : 'p', m = j.checkEndOfBlock(), n = new CKEDITOR.dom.elementPath(h.getSelection().getStartElement()), o = n.block, p = o && n.block.getName(), q = false;
        if (!a && p == 'li') {
            e(h, i, j);
            return;
        }
        if (!a && m && b.test(p)) {
            k.createElement('br').insertAfter(o);
            if (CKEDITOR.env.gecko)k.createText('').insertAfter(o);
            j.setStartAt(o.getNext(), CKEDITOR.env.ie ? CKEDITOR.POSITION_BEFORE_START : CKEDITOR.POSITION_AFTER_START);
        } else {
            var r;
            q = p == 'pre';
            if (q)r = k.createText(CKEDITOR.env.ie ? '\r' : '\n'); else r = k.createElement('br');
            j.deleteContents();
            j.insertNode(r);
            if (!CKEDITOR.env.ie)k.createText('﻿').insertAfter(r);
            if (m && !CKEDITOR.env.ie)r.getParent().appendBogus();
            if (!CKEDITOR.env.ie)r.getNext().$.nodeValue = '';
            if (CKEDITOR.env.ie)j.setStartAt(r, CKEDITOR.POSITION_AFTER_END);
            else j.setStartAt(r.getNext(), CKEDITOR.POSITION_AFTER_START);
            if (!CKEDITOR.env.ie) {
                var s = null;
                if (!CKEDITOR.env.gecko) {
                    s = k.createElement('span');
                    s.setHtml('&nbsp;');
                } else s = k.createElement('br');
                s.insertBefore(r.getNext());
                s.scrollIntoView();
                s.remove();
            }
        }
        j.collapse(true);
        j.select(q);
    }

    ;
    function g(h) {
        var i = h.getSelection().getRanges();
        for (var j = i.length - 1; j > 0; j--)i[j].deleteContents();
        return i[0];
    }

    ;
})();
